package co.edu.uniandes.bi.youtube;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.PrintWriter;
import java.net.URL;
import java.util.Calendar;
import java.util.Date;

import com.google.gdata.client.youtube.YouTubeService;
import com.google.gdata.data.extensions.Rating;
import com.google.gdata.data.youtube.VideoEntry;
import com.google.gdata.data.youtube.YtStatistics;

public class YouTubeBI {
	
	/**
	 * Key necesario para autenticar la aplicacion frente a youtube
	 */
	private final static String DEV_KEY = "AI39si5mBCIEpcXiyvuZcPssqEiC2OzjNFPXfLGIUJ3k9Y2YWoIFtPRACX0ns1sQOSO0ZLViRSUpBgBOk__O14lAArvzKNWDkw";
	
	/**
	 * Archivo que contiene la lista de videos
	 */
	private final static String LISTA_VIDEOS_FILE = "./data/videos.txt";
	
	/**
	 * Servicio del aPI de youtube
	 */
	private YouTubeService service;
	
	/**
	 * Constructor por defecto
	 */
	public YouTubeBI( )
	{
		service = new YouTubeService(null, DEV_KEY);
		obtenerDatos( );
	}
	
	/**
	 * Obtiene los datos desde youtube y los guarda en el archivo de datos
	 */
	public void obtenerDatos( )
	{
		Calendar hoy = Calendar.getInstance();
		hoy.setTime( new Date( ));
		File archivo = new File( "./data/bd/"
				+hoy.get(Calendar.YEAR)+"_"
				+hoy.get(Calendar.MONTH)+"_"
				+hoy.get(Calendar.DAY_OF_MONTH)
				+".txt" );
		
		if( archivo.exists() )
		{
			System.out.println("Ya se cargaron los datos de hoy. Abortando operacion.");
			return;
		}
		
		PrintWriter out;
		try {
			out = new PrintWriter( archivo );
			try {
				String[] videos = getListaVideos();
				for( String video : videos )
				{
					String stats = getStatsVideo(video);
			        out.println( stats );
				}
			
			} catch (Exception e) {
				e.printStackTrace();
			}
			out.close();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
	}
	
	/**
	 * Obtiene los datos de un video de youtube
	 * @param video ID del video
	 * @return String que es la contatenacion de los datos por comas
	 * @throws Exception Si hay algubn error leyendo de youtube
	 */
	private String getStatsVideo( String video ) throws Exception
	{
		VideoEntry videoEntry = service.getEntry(new URL("http://gdata.youtube.com/feeds/api/videos/"+video), VideoEntry.class);
		Rating rat = videoEntry.getRating();
		YtStatistics stats = videoEntry.getStatistics();
		
		Long views = stats.getViewCount();
		Long favs = stats.getFavoriteCount();
		Float avg = rat.getAverage();
		Integer comments = videoEntry.getComments().getFeedLink().getCountHint();
		String titulo = videoEntry.getTitle().getPlainText();
		Integer raters = rat.getNumRaters();
		
		System.out.println("Title: "+titulo);
		System.out.println("Views: "+views);
		System.out.println("Favorites: "+favs);
		System.out.println("Comments: "+comments);
		System.out.println("Average Rating: "+avg);
		System.out.println("Num Raters: "+raters);
		
		return titulo+","+views+","+favs+","+comments+","+avg+","+raters;
	}
	
	/**
	 * Obtiene la lista de videos del archivo de configuracion
	 * @return Lista de videos
	 * @throws Exception Si hay un error abriendo el archivo de configuracion
	 */
	private String[] getListaVideos( ) throws Exception
	{
		BufferedReader lector = new BufferedReader( new FileReader( LISTA_VIDEOS_FILE ) );
		String linea = lector.readLine();
		
		if( linea != null )
			return linea.split(",");
		
		throw new Exception( "Archivo invalido" );
	}
	
	/**
	 * Metodo que genera el CSV para el proceso de ETL
	 */
	public void etl( )
	{
		
	}
	
	/**
	 * Metodo main del programa
	 */
	public static void main(String[] args) 
	{
		new YouTubeBI( );
	}

}
